给人民群众的BLS12-381指南 (未完成)

开始鼓捣之前,我希望我知道的。 近年来,椭圆曲线BLS12-381已成逐渐火了起来。许多协议都将其应用到了数字签名和零知识证明中:Zcash、Ethereum 2.0、Skale、Algorand、Dfinity、Chia 等等。 不幸的是,现有的关于 BLS12-381 的材料里充满着晦涩的咒语,比如“实例化其六角扭”和“最优扩展域塔”。我就是来解决这个问题的 :smile: 1 两个名词的正确翻译和含义 我不会对椭圆曲线及其令人兴奋的群的性质进行一般性介绍。这方面已经有一些很棒的入门书了,我将假设读者具有这些基础知识。当然,这里有很多内容并非只特定于 BLS12-381,而是也适用于其他曲线。

动机

BLS12-381 是一个配对友好的椭圆曲线。

基于配对的密码学在过去几十年得到了很大发展,使很多有用的新应用成为了可能,例如可高效聚合的短数字签名基于身份的密码学单轮多方密钥交换和高效的多项式承诺方案(如KZG承诺

配对友好的椭圆曲线是具有良好的嵌入度(将在下面解释!)和大素数阶子群(也见下文)的曲线。这些曲线很少见。如果你随机创建一条椭圆曲线,它是配对友好的可能性非常之小。然而,它们是可以构造出来的, BLS 曲线就被显式构造为配对友好的。还有其他几个配对友好曲线系列。

如果你想了解有关基于配对的密码学的更多信息,请阅读下面这些不错的材料: (点击展开。)

一个简短的(但技术性的)解释,以及另一个

Vitalik 对椭圆曲线配对进行了很好的一般性介绍。

这份NIST 报告可读性很强。我推荐第 2 节和附录。

同样好的背景材料是配对友好曲线的IETF 标准草案

如果你想真的理解这些东西,那么Pairings for Beginners就很棒。如果你仔细研究,学习里面的例子,事实证明它并没有看起来那么可怕。我真的很推荐这个(但我也一直都在学习中……)。

关于曲线BLS12-381

历史

曲线 BLS12-381是由Sean Bowe在 2017 年初设计的,作为一次 Zcash 协议升级的基础内容。它既对配对友好(使其对数字签名高效)又对构建 zkSnarks 有效。

“下一代”、可扩展区块链协议的激增使得生成可以高效聚合以及轻松设置门限的短数字签名变得非常重要。BLS12-381 的特性使其经常成为这些协议的首选曲线。

一些密码学库——Apache 的Milagro等成熟库,以及HerumiBlst等新兴库——都支持 BLS12-381。并且已经有将 BLS12-381 纳入 IETF 标准的举措,例如Pairing-Friendly CurvesHashing to Elliptic CurvesBLS signatures。这对于协议互操作性来说是个好消息!

命名

BLS12-381 是Barreto、Lynn 和 Scott描述的曲线族的一部分(它们是此处显示的 B、L 和 S -稍后将出现不同的 BLS 三人组)。

12 是曲线的嵌入度:既不太低也不太高。稍后我们将讨论嵌入度。

381是表示曲线上坐标所需的比特数:域模数,$q$。 一个点的坐标来自一个具有素数阶的有限域,而那个素数,$q$, 是 381 比特。381 是一个相当方便的数字,因为我们可以为每个域元素使用 48 个字节,剩下 3 比特用于有用的标志或算术优化。这个数字的大小取决于安全要求和实现效率。

曲线方程和参数

域扩展

两条曲线

子群

配对

嵌入度

安全级别

协因子

单位根

使用曲线BLS12-381

BLS数字签名

现在是介绍另一个 BLS 的时候了:Boneh、Lynn 和 Shacham。(L 与 BLS12-381 中的 L 是一个人;B 和 S 不是。)

BLS 签名于 2001 年提出,比 2002 年BLS 曲线系列发布稍早一些。令人高兴的是,它们是携手共进的关系。(BLS 签名可以使用其他曲线;BLS 曲线也有签名以外的用途。但是当它们结合在一起时就挺不错。)

IETF 标准草案中对 BLS 签名方案有相当简洁明了的描述。另请参阅该GitHub 库

公私钥

签名

验证

聚合

恶意密钥攻击

交换G1和G2

点压缩

子群成员检验

生成元

最终指数

哈希到曲线

哈希并检验

Simplified SWU map

协因子清除

扩展塔

坐标系

仿射坐标

标准射影坐标

Jacobian 坐标

进一步阅读资源

上面链接了很多参考资料,这里就不重复了。 我只会挑出一些特别有用或有趣的东西。

有用的参考资料:

原始 BLS12-381 公告 参数和序列化的简明描述 IETF 标准草案 上面的 tl;dr 版本,BLS for Busy People 一般来说,配对库的实现往往是高度优化的和/或非常通用的(支持许多曲线),这使得它们很难学习。 Paul Miller 的 JavaScript/TypeScript 中的 Noble BLS12-381 库绝对是比较容易理解的。

最后,一些有趣和有趣的读物:

这份关于 Curve9769 的全新白皮书与 BLS12-381 没有直接关系,但它是对设计和实现椭圆曲线(在这种情况下不是配对友好的)的乐趣和痛苦的写得很好的精彩探索。 配对并没有死,只是在休息。 一个很好的概述介绍。 一些 BLS12-381 的东西。

就这样吧,朋友们拜拜!

  1. 我多年前学习过数学,但一直在努力回避任何与纯数学有关的事情,包括群论。 我现在很后悔。 无论如何,这不会太技术性,但我也不是专家,所以可能会出错,而且一般来说会有点手忙脚乱。 如果不是很明显的话我再澄清一下,我不是密码学家。